#ifndef MULTHREAD_H
#define MULTHREAD_H

#include <QThread>
#include <winsock2.h>
#include "pcap.h"
#include "Format.h"
#include "DataPackage.h"

class multhread : public QThread
{
    Q_OBJECT
public:
    multhread();
    bool setPointer(pcap_t* pointer);  // 设置pcap指针
    void setFlag();  // 设置标志
    void resetFlag();  // 重置标志
    void run() override;  // 重写run方法，实现线程主体
    int ethernetPackageHandle(const u_char* pkt_content, QString &info);  // 处理以太网数据包
    int ipPackageHandle(const u_char* pkt_content, int& ipPackage);  // 处理IP数据包
    int tcpPackageHandle(const u_char* pkt_content, QString& info, int ipPackage);  // 处理TCP数据包
    int udpPackageHandle(const u_char* pkt_content, QString& info);  // 处理UDP数据包
    int icmpPackageHandle(const u_char* pkt_content, QString& info);  // 处理ICMP数据包
    QString arpPackageHandle(const u_char* pkt_content);  // 处理ARP数据包
    QString dnsPackageHandle(const u_char* pkt_content);  // 处理DNS数据包
    QString byteToString(u_char* str, int size);  // 字节数组转字符串

    // 网络字节序转主机字节序的宏定义
#define NTOHS(A) ((((A)&0xFF00)>>8) | (((A)&0x00FF)<<8))
#define NTOHSL(A) ((((A) & 0xff000000) >> 24) | \
                   (((A) & 0x00ff0000) >>  8) | \
                   (((A) & 0x0000ff00) <<  8) | \
                   (((A) & 0x000000ff) << 24))

signals:
    void send(DataPackage data);  // 发送数据包信号

private:
    pcap_t* pointer;  // pcap句柄
    struct pcap_pkthdr* packHeader;  // 数据包头
    const u_char* packData;  // 数据包内容
    time_t local_time_sec;  // 本地时间（秒）
    struct tm local_time;  // 本地时间结构
    char timeString[16];  // 时间字符串
    bool isDone;  // 完成标志
};

#endif // MULTHREAD_H
